const { DataTypes, Sequelize, Model } = require('sequelize');
const sequelize = require('../config/database');

/**
 * 操作日志模型
 * 记录用户的重要操作行为，用于审计和安全追踪
 */
class OperationLogs extends Model {
  /**
   * 创建操作日志实例
   * @param {Object} logData - 日志数据
   * @returns {Promise<OperationLogs>} - 创建的日志实例
   */
  static async createLog(logData) {
    return this.create(logData);
  }
  
  /**
   * 查询指定用户的操作日志
   * @param {number} userId - 用户ID
   * @param {Object} options - 查询选项
   * @returns {Promise<OperationLogs[]>} - 日志列表
   */
  static async getUserLogs(userId, options = {}) {
    return this.findAll({
      where: { user_id: userId },
      ...options
    });
  }
  
  /**
   * 查询指定操作类型的日志
   * @param {string} operationType - 操作类型
   * @param {Object} options - 查询选项
   * @returns {Promise<OperationLogs[]>} - 日志列表
   */
  static async getLogsByType(operationType, options = {}) {
    return this.findAll({
      where: { operation_type: operationType },
      ...options
    });
  }
  
  /**
   * 获取最近的操作日志
   * @param {number} limit - 返回的记录数
   * @returns {Promise<OperationLogs[]>} - 最近的日志列表
   */
  static async getRecentLogs(limit = 100) {
    return this.findAll({
      order: [['created_at', 'DESC']],
      limit
    });
  }
}

// 直接初始化模型
OperationLogs.init({
    // 主键，使用BIGINT类型以支持大量数据
    id: {
      type: DataTypes.BIGINT,
      autoIncrement: true,
      primaryKey: true,
      comment: '日志ID'
    },
    
    // 操作用户ID，外键关联到用户表
    user_id: {
      type: DataTypes.BIGINT,
      allowNull: true, // 允许为null，支持未登录用户操作
      comment: '操作用户ID'
    },
    
    // 操作类型
    operation_type: {
      type: DataTypes.STRING(50),
      allowNull: false,
      comment: '操作类型'
    },
    
    // 操作描述
    operation_desc: {
      type: DataTypes.TEXT,
      allowNull: true,
      comment: '操作描述'
    },
    
    // 操作目标ID
    target_id: {
      type: DataTypes.STRING(100),
      allowNull: true,
      comment: '操作目标ID'
    },
    
    // 操作目标类型
    target_type: {
      type: DataTypes.STRING(50),
      allowNull: true,
      comment: '操作目标类型'
    },
    
    // 客户端IP地址
    ip_address: {
      type: DataTypes.STRING(45),
      allowNull: true,
      comment: 'IP地址'
    },
    
    // 客户端信息
    user_agent: {
      type: DataTypes.TEXT,
      allowNull: true,
      comment: '用户代理'
    },
    
    // 创建时间
    created_at: {
      type: DataTypes.DATE,
      allowNull: false,
      defaultValue: DataTypes.NOW,
      comment: '创建时间'
    },
    
    // 更新时间
    updated_at: {
      type: DataTypes.DATE,
      allowNull: false,
      defaultValue: DataTypes.NOW,
      onUpdate: DataTypes.NOW,
      comment: '更新时间'
    }
  }, {
    sequelize,
    tableName: 'operation_logs',
    timestamps: true,
    underscored: true, // 使用下划线命名
    indexes: [
      // 创建索引以提高查询性能
      { name: 'idx_user_id', fields: ['user_id'] },
      { name: 'idx_operation_type', fields: ['operation_type'] },
      { name: 'idx_created_at', fields: ['created_at'] }
    ],
    comment: '操作日志表'
  });

module.exports = OperationLogs;